package com.woniuxy.hrp.service.Serviceimpl;


import com.woniuxy.hrp.entity.Patient;
import com.woniuxy.hrp.entity.Reservation;
import com.woniuxy.hrp.entity.Wallet;
import com.woniuxy.hrp.exception.PatientRepeatAccEmailPhoneException;
import com.woniuxy.hrp.mapper.PatientMapper;
import com.woniuxy.hrp.mapper.WalletMapper;
import com.woniuxy.hrp.service.PatientService;
import com.woniuxy.hrp.utils.UUIDUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

/**
 *@Description：
 *@CreateTime：2022/8/29 22:17
 *@Author：曹杰克
 */
@Service("patientServiceImpl")
@Transactional
@Slf4j
public class PatientServiceImpl implements PatientService {
    @Autowired
    PatientMapper patientMapper;

    @Autowired
    WalletMapper walletMapper;

    @Override
    public Patient getById(int id) {
        Patient patient = patientMapper.selectById(id);
        return patient;
    }

    //查询所有患者
    @Override
    public List<Patient> getAll() {
        List<Patient> patients = patientMapper.selectAll();
        return patients;
    }

    /**
     * @description: 患者账号解冻
     * @param: id
     * @return: com.woniuxy.hrp.entity.Hospital
     * @author: WY
     **/
    @Override
    public void unlock(int id) {
        patientMapper.authById(id);
    }

    @Override
    public void updateByCondition(Patient patient) {
        patientMapper.updateByCondition(patient);

    }

    @Override
    public void updatePassWord(Patient patient) {
        patientMapper.updatePassWord(patient);
    }

    /**
     * 新患者注册
     * 注册（账号，邮箱，手机号不重复）
     * 同时发送一封激活邮件
     * 状态：U-未激活邮箱 Y-正常，激活成功 F-冻结
     * @param patient
     * @Author: shanshanfan
     * @return
     */
    @Override
    public void register(Patient patient) {

        // 调用根据账号查数量，根据邮箱查数量，根据手机查数量
        int nums = patientMapper.getNumsByAccOrEmailOrPhone(patient);
        if (nums != 0) {
            throw new PatientRepeatAccEmailPhoneException(
                    "账号:" + patient.getAccount() + "，邮箱:" + patient.getEmail() + "或手机号:" + patient.getPhone() + "已存在");
        }

        // 状态：U-未激活邮箱 Y-正常，认证成功 F-冻结
        patient.setStatus("U");
        patient.setMlCardNumber(UUIDUtil.generate_UUID());

        patientMapper.add(patient);

        //获取激活码
//
//        String code = patient.getCode();
//        log.debug("code:{}",code);

//        //主题内容
//        String subject = "来自xxx网站的激活邮件";
//        //patient/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户，如果存在说明一致，将用户状态修改为“Y”激活
//        //上面的激活码发送到用户注册邮箱
//        String context = "<a href=\"/patient/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
//        //发送激活邮件
//        mailService.sendHtmlMail(patient.getEmail(),subject,context);

    }

//    /**
//     * 根据激活码code进行查询患者，之后再进行修改状态
//     * 状态：U-未激活邮箱，默认状态 Y-激活成功 F-冻结
//     * @param code
//     * @Author: shanshanfan
//     * @return
//     */
//    @Override
//     public Patient checkCode(String code) {
//       return patientMapper.checkCode(code);
//    };

    /**
     * 激活患者账户，修改患者账号状态为“Y”进行激活
     * 激活成功后，同时创建一个钱包
     * @param patient
     * @Author: shanshanfan
     * @return
     */
    @Override
    public void updatePatientStatus(Patient patient){
        patientMapper.updatePatientStatus(patient);

        //激活成功后，同时创建一个钱包
        Wallet wallet = new Wallet();
        wallet.setBalance(new BigDecimal(0));//初始余额为0
        wallet.setPatient(patient);
        walletMapper.insert(wallet);

    };

    /**
     * 患者登录
     * @param patient
     * @Author: shanshanfan
     * @return
     */
    @Override
    public Patient loginPatient(Patient patient) {
        Patient patient1 = patientMapper.selectByAccAndPsw(patient);
        if(patient1 != null) {
            return patient1;
        }
        return null;
    }


    /**
     * 查询预约信息（按条件查询） 连预约信息表
     * 预约信息表中状态：T-待完成的预约 D-已完成预约 U-未付款的预约
     *
     * @param status
     * @author shanshanfan
     * @return List<Reservation>
     */
    @Override
    public List<Reservation> getReservationByStatus(String status) {
        return patientMapper.getReservationByStatus(status);
    }



    /**
     * @description: 患者账号锁定
     * @param: id
     * @return: com.woniuxy.hrp.entity.Hospital
     * @author: WY
     **/
    @Override
    public void lock(int id) {
        patientMapper.delete(id);
    }
}
